---
title: 混合检索
version: '简体中文'
---

### 为什么需要混合检索？

RAG 检索环节中的主流方法是向量检索，即语义相关度匹配的方式。技术原理是通过将外部知识库的文档先拆分为语义完整的段落或句子，并将其转换（Embedding）为计算机能够理解的一串数字表达（多维向量），同时对用户问题进行同样的转换操作。

计算机能够发现用户问题与句子之间细微的语义相关性，比如 “猫追逐老鼠” 和 “小猫捕猎老鼠” 的语义相关度会高于 “猫追逐老鼠” 和 “我喜欢吃火腿” 之间的相关度。在将相关度最高的文本内容查找到后，RAG 系统会将其作为用户问题的上下文一起提供给大模型，帮助大模型回答问题。

除了能够实现复杂语义的文本查找，向量检索还有其他的优势：

* 相近语义理解（如老鼠/捕鼠器/奶酪，谷歌/必应/搜索引擎）
* 多语言理解（跨语言理解，如输入中文匹配英文）
* 多模态理解（支持文本、图像、音视频等的相似匹配）
* 容错性（处理拼写错误、模糊的描述）

虽然向量检索在以上情景中具有明显优势，但有某些情况效果不佳。比如：

* 搜索一个人或物体的名字（例如，伊隆·马斯克，iPhone 15）
* 搜索缩写词或短语（例如，RAG，RLHF）
* 搜索 ID（例如， `gpt-3.5-turbo` ， `titan-xlarge-v1.01` ）

而上面这些的缺点恰恰都是传统关键词搜索的优势所在，传统关键词搜索擅长：

* 精确匹配（如产品名称、姓名、产品编号）
* 少量字符的匹配（通过少量字符进行向量检索时效果非常不好，但很多用户恰恰习惯只输入几个关键词）
* 倾向低频词汇的匹配（低频词汇往往承载了语言中的重要意义，比如“你想跟我去喝咖啡吗？”这句话中的分词，“喝”“咖啡”会比“你”“想”“吗”在句子中承载更重要的含义）

对于大多数文本搜索的情景，首要的是确保潜在最相关结果能够出现在候选结果中。向量检索和关键词检索在检索领域各有其优势。混合搜索正是结合了这两种搜索技术的优点，同时弥补了两方的缺点。

在混合检索中，你需要在数据库中提前建立向量索引和关键词索引，在用户问题输入时，分别通过两种检索器在文档中检索出最相关的文本。

<Frame title="混合检索">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (178).png" alt="" width="563" />
</Frame>

“混合检索”实际上并没有明确的定义，本文以向量检索和关键词检索的组合为示例。如果我们使用其他搜索算法的组合，也可以被称为“混合检索”。比如，我们可以将用于检索实体关系的知识图谱技术与向量检索技术结合。

不同的检索系统各自擅长寻找文本（段落、语句、词汇）之间不同的细微联系，这包括了精确关系、语义关系、主题关系、结构关系、实体关系、时间关系、事件关系等。可以说没有任何一种检索模式能够适用全部的情景。**混合检索通过多个检索系统的组合，实现了多个检索技术之间的互补。**

### **向量检索**

定义：通过生成查询嵌入并查询与其向量表示最相似的文本分段。

<Frame title="向量检索设置">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (167).png" alt="" width="563" />
</Frame>

**TopK：** 用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。系统默认值为 3 。

**Score 阈值：** 用于设置文本片段筛选的相似度阈值，即：只召回超过设置分数的文本片段。系统默认关闭该设置，即不会对召回的文本片段相似值过滤。打开后默认值为 0.5 。

**Rerank 模型：** 你可以在“模型供应商”页面配置 Rerank 模型的 API 秘钥之后，在检索设置中打开“Rerank 模型”，系统会在语义检索后对已召回的文档结果再一次进行语义重排序，优化排序结果。设置 Rerank 模型后，TopK 和 Score 阈值设置仅在 Rerank 步骤生效。

### **全文检索**

定义：索引文档中的所有词汇，从而允许用户查询任意词汇，并返回包含这些词汇的文本片段。

<Frame title="全文检索设置">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (173).png" alt="" width="563" />
</Frame>

**TopK：** 用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。系统默认值为 3 。

**Rerank 模型：** 你可以在“模型供应商”页面配置 Rerank 模型的 API 秘钥之后，在检索设置中打开“Rerank 模型”，系统会在全文检索后对已召回的文档结果再一次进行语义重排序，优化排序结果。设置 Rerank 模型后，TopK 和 Score 阈值设置仅在 Rerank 步骤生效。

### **混合检索**

同时执行全文检索和向量检索，并应用重排序步骤，从两类查询结果中选择匹配用户问题的最佳结果，需配置 Rerank 模型 API。

<Frame title="混合检索设置">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (169).png" alt="" width="563" />
</Frame>

**TopK：** 用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。系统默认值为 3 。

**Rerank 模型：** 你可以在“模型供应商”页面配置 Rerank 模型的 API 秘钥之后，在检索设置中打开“Rerank 模型”，系统会在混合检索后对已召回的文档结果再一次进行语义重排序，优化排序结果。设置 Rerank 模型后，TopK 和 Score 阈值设置仅在 Rerank 步骤生效。

### 创建数据集时设置检索模式

进入“数据集->创建数据集”页面并在检索设置中设置不同的检索模式：

<Frame title="创建数据集时设置检索模式">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (170).png" alt="" width="563" />
</Frame>

### 数据集设置中修改检索模式

进入“数据集->选择数据集->设置”页面中可以对已创建的数据集修改不同的检索模式。

<Frame title="数据集设置中修改检索模式">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (171).png" alt="" width="563" />
</Frame>

### 提示词编排中修改检索模式

进入“提示词编排->上下文->选择数据集->设置”页面中可以在创建应用时修改不同的检索模式。

<Frame title="提示词编排中修改检索模式">
  <img src="/zh-hans/user-guide/.gitbook/assets/image (172).png" alt="" />
</Frame>

{/*
Contributing Section
DO NOT edit this section!
It will be automatically generated by the script.
*/}

<CardGroup cols="2">
    <Card
        title="编辑此页面"
        icon="pen-to-square"
        href="https://github.com/langgenius/dify-docs-mintlify/edit/main/zh-hans/guides/knowledge-base/indexing-and-retrieval/hybrid-search.mdx"
    >
        通过直接提交修改来帮助改进文档内容
    </Card>
    <Card
        title="提交问题"
        icon="github"
        href="https://github.com/langgenius/dify-docs-mintlify/issues/new?title=文档问题%3A%20d-sea&body=%23%23%20问题描述%0A%3C%21--%20请简要描述您发现的问题%20--%3E%0A%0A%23%23%20页面链接%0Ahttps%3A%2F%2Fgithub.com%2Flanggenius%2Fdify-docs-mintlify%2Fblob%2Fmain%2Fzh-hans/guides/knowledge-base/indexing-and-retrieval%2Fhybrid-search.mdx%0A%0A%23%23%20建议修改%0A%3C%21--%20如果有具体的修改建议，请在此说明%20--%3E%0A%0A%3C%21--%20感谢您对文档质量的关注！%20--%3E"
    >
        发现错误或有改进建议？请提交问题反馈
    </Card>
</CardGroup>
